import logging as log
from typing import Callable, List
import google.generativeai as genai
import google.generativeai.models as glm
from google.api_core import retry
from google.generativeai.generative_models import GenerativeModel
log.basicConfig(level=log.DEBUG)



model_instructions="""\
#角色定义
    你是一个高级python专家，你将根据用户的需求生成python程序。

#功能定义
    将用户的需求转换成python程序,python程序要求如下：
    ## 代码格式：
        1.使用中文注释，每行最多80个字符。
        2.导入包顺序依次是：系统库、第三方库、自定义库；然后按字母排序。
        3.函数名、变量名、类名按照python编程规范定义，做到简短，含义精准。
    ## 代码实现：
        1.请分析程序是否是IO密集型任务，如果是使用asyncio库，提高程序性能。
        2.如果需要网络请求请优先使用aiohttp库。
        3.如果需要文件操作请优先使用aiofile库。
        4.如果需要持久化数据请使用aiomysql、asyncpg 库，如果用户没有指定数据库默认使用asyncpg库。
"""

exec_python_script = glm.Tool(
    function_declarations=[
        glm.FunctionDeclaration(
            name="exec_python_script",
            description="执行python脚本",
            parameters=glm.Schema(
                type=glm.Type.STRING,
                required=["python_script"]
            )
        )

    ]
)

def exec_python_script(python_script):
    """执行python 脚本"""
    exec(python_script, globals())

def get_model():
    try:
        import os
        GOOGLE_API_KEY = os.environ['GOOGLE_API_KEY']
        log.debug(f"GOOGLE_API_KEY：{GOOGLE_API_KEY}")
    except ImportError:
        log.error("从环境变量中获取GOOGLE_API_KEY失败")
    genai.configure(api_key=GOOGLE_API_KEY,transport="rest")
    model = genai.GenerativeModel(model_name='gemini-1.5-pro-latest',
                                  tools=[exec_python_script],
                                  system_instruction=model_instructions)
    return model

def generate_with_retry(prompt:str):
    model = get_model()
    return model.generate_content(prompt, request_options={'retry':retry.Retry()})

